﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CROSLAND.BL.BE;
using CROSLAND.BL.BC;
using System.Globalization;
using System.Text;
using System.Configuration;

namespace CROSLAND.WebApp.UserControl
{
    public partial class PagoControl : System.Web.UI.UserControl
    {
        CabPagoBE objPago = new CabPagoBE();
        List<DetPagosBE> lstDPago = new List<DetPagosBE>();
        List<DetPedFacBE> lstPFac = new List<DetPedFacBE>();
        public event ImageClickEventHandler Aceptar;
        
        public string NroPedido
        {
            get { return (!string.IsNullOrEmpty(this.txtNumPedido.Text)) ? this.txtNumPedido.Text : null; }
            set { this.txtNumPedido.Text = value; }
        }

        public decimal TipoCambio
        {
            get { return (!string.IsNullOrEmpty(this.hfTipoCambio.Value)) ? decimal.Parse(this.hfTipoCambio.Value) : 0; }
            set { this.hfTipoCambio.Value = value.ToString(); }
        }

        public string Mensaje
        {
            get { return this.hfMensajeFinal.Value; }
            set { this.hfMensajeFinal.Value = value; }
        }

        public string TipoDocumento
        {
            get { return this.hfTipoDocumento.Value; }
            set { this.hfTipoDocumento.Value = value; }
        }

        public string NroFolio
        {
            get { return this.txtNroFolioFijo.Text + "-" + this.txtNroFolio.Text.PadLeft(7, '0'); }
          
        }

        public List<string> ListaEfectivo
        {
            get { return (ViewState["ListaEfectivo"] != null) ? (List<string>)ViewState["ListaEfectivo"] : new List<string>(); }
            set { ViewState["ListaEfectivo"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            this.btnProcesarMedioPago.Attributes.Add("onclick", "return confirm('¿Esta seguro de realizar esta operación?')");

            if (!IsPostBack)
            {               

                this.lTotalPago.Text = "---";
                this.gvMedioPago.DataSource = null;
                this.gvMedioPago.DataBind();

                List<GenericBE> lstOficinas = new List<GenericBE>();
                List<GenericBE> lstCodigoPostal = new List<GenericBE>();
                List<GenericBE> lstTipoDocumento = new List<GenericBE>();
                List<GenericBE> lstGrupoVendedores = new List<GenericBE>();
                List<GenericBE> lstSectores = new List<GenericBE>();
                List<GenericBE> lstMotivos = new List<GenericBE>();
                List<GenericBE> lstGrupoCond = new List<GenericBE>();
                List<GenericBE> lstBloqueoEntrega = new List<GenericBE>();
                List<GenericBE> lstBloqueoFactura = new List<GenericBE>();
                List<GenericBE> lstVendedores = new List<GenericBE>();
                List<GenericBE> lstTipoVisita = new List<GenericBE>();
                List<GenericBE> lstCondicionPago = new List<GenericBE>();
                List<GenericBE> lstAlmacen = new List<GenericBE>();
                List<GenericBE> lstAsesores = new List<GenericBE>();
                List<GenericBE> lstCondExp = new List<GenericBE>();
                List<GenericBE> lstCanal = new List<GenericBE>();
                List<GenericBE> lstOrgVta = new List<GenericBE>();
                List<GenericBE> lstMotRec = new List<GenericBE>();
                List<GenericBE> lstZonaReg = new List<GenericBE>();
                List<GenericBE> lstGrupoCli = new List<GenericBE>();
                List<GenericBE> lstCampaña = new List<GenericBE>();
                List<GenericBE> lstCity = new List<GenericBE>();
                List<GenericBE> lstColor = new List<GenericBE>();
                List<GenericBE> lstGrpArt = new List<GenericBE>();
                List<GenericBE> lstZReg = new List<GenericBE>();
                List<GenericBE> lstDispo = new List<GenericBE>();
                List<UbigeoBE> lstUbigeos = new List<UbigeoBE>();
                List<GenericBE> lstBancoCheque = new List<GenericBE>();
                List<GenericBE> ltsBancoDepo = new List<GenericBE>();
                List<GenericBE> lstProcesadora = new List<GenericBE>();
                List<LibrosxvstelBE> lstLibrosxvstel = new List<LibrosxvstelBE>();
                DateTime fecHasta = new DateTime();
                decimal pIGV;
                ParametroBC.Instance.getDataDDL(ref lstAlmacen, ref lstAsesores,
                                ref lstBloqueoEntrega, ref lstBloqueoFactura, ref lstCanal, ref lstCondExp, ref lstCondicionPago,
                                ref lstGrupoCond, ref lstGrupoVendedores, ref lstMotivos, ref lstOficinas, ref lstOrgVta, ref lstSectores,
                                ref lstTipoDocumento, out fecHasta, ref lstMotRec, ref lstZonaReg, ref lstGrupoCli, ref lstUbigeos, ref lstCampaña,
                                ref lstCity, ref lstColor, ref lstDispo, ref lstGrpArt, ref lstZReg,
                                ref lstBancoCheque, ref ltsBancoDepo, ref lstProcesadora, ref lstLibrosxvstel, out pIGV);


                Session["librosxvstel"] = lstLibrosxvstel;
            }
        }
        
        public void CargarDatos()
        {
            UsuarioWebBE uw = new UsuarioWebBE();
            uw = (UsuarioWebBE)Session["UsuarioWeb"];
            PedidoBE pedido = PedidoBC.Instance.leer(NroPedido, uw);
            

            this.gvDetalle.DataSource = pedido.Detalle;
            this.gvDetalle.DataBind();
           
            this.hfMoneda.Value = pedido.Moneda;
            this.hfMonedaVuelto.Value = pedido.Moneda;

            this.lTipoCambio.Text = TipoCambio.ToString("N", CultureInfo.InvariantCulture);

            ListItem liMoneda = this.ddlMonedaVuelto.Items.FindByValue(pedido.Moneda);
            if (liMoneda != null)
                this.ddlMonedaVuelto.SelectedValue = pedido.Moneda;
            
            string strMoneda = (this.hfMoneda.Value == "USD") ? "$." : "S/.";
            
            this.lImpuestos.Text = strMoneda + pedido.Igv.ToString("N", CultureInfo.InvariantCulture);
            this.lSubTotal.Text = strMoneda + pedido.SubTotal.ToString("N", CultureInfo.InvariantCulture);
            this.lTotal.Text = strMoneda + pedido.Total.ToString("N", CultureInfo.InvariantCulture);

            this.hfTotal.Value = pedido.Total.ToString();

            this.ddlMonedaVuelto.Visible = false;
            this.lTitVuelto.Visible = false;
            this.lVuelto.Visible = false;
            this.lVuelto.Text = string.Empty;
            this.lMonVuelto.Visible = false;
            this.lTotalPago.Text = "---";
            this.gvMedioPago.DataSource = null;
            this.gvMedioPago.DataBind();
            this.lblPendiente.Text = string.Empty;
            Session["total"] = null;
            Session["listDPago"] = null;
            ViewState["ListaEfectivo"] = null;
            this.ddlTipoDocumento.SelectedIndex = -1;
            this.txtNroFolio.Text = string.Empty;
            this.txtNroFolioFijo.Text = string.Empty;
            this.hfVuelto.Value = string.Empty;
            this.ddlMedioPago.SelectedIndex = -1;
            this.txtMontoMedioPago.Text = string.Empty;
            this.ddlMonedaMedioPago.SelectedIndex = -1;
            this.ddlOperador.SelectedIndex = -1;
            this.txtAP.Text = string.Empty;
            this.txtREF.Text = string.Empty;
            this.txtNroOperacionMP.Text = string.Empty;
            this.ddlBanco.SelectedIndex = -1;

            if (this.TipoCambio == 0)
            {
                this.ddlMonedaVuelto.Enabled = false;
            }

            List<GenericBE> list = ParametroBC.Instance.cmbTipodocFac();
            list.RemoveAll(X => X.Adic1 != pedido.CodTipoDoc);//Dejar solo los tipo factura para el tipo de documento
            this.ddlTipoDocumento.DataSource = list;
            this.ddlTipoDocumento.DataBind();
            if (ParametroBC.Instance.esTipoX(pedido.CodTipoDoc, "Anticipo"))
            {
                this.TipoDocumento = "ANTICIPO";
                txtNroFolio.Enabled = true;
            }
            else if (ParametroBC.Instance.esTipoX(pedido.CodTipoDoc, "DocRepuestos"))
            {
                this.TipoDocumento = "COTIZACION";
                txtNroFolio.Enabled = false;
            }

            //if (pedido.CodTipoDoc == ConfigurationManager.AppSettings["Anticipo"])
            //{               
            //    list.RemoveAll(X => (X.Codigo == "001" || X.Codigo == "003"));
            //    this.ddlTipoDocumento.DataSource = list;
            //    this.ddlTipoDocumento.DataBind();
            //    this.TipoDocumento = "ANTICIPO";
            //}
            //if (pedido.CodTipoDoc == ConfigurationManager.AppSettings["CotizacionRep"])
            //{
            //    list.RemoveAll(X => (X.Codigo == "002" || X.Codigo == "004"));
            //    this.ddlTipoDocumento.DataSource = list;
            //    this.ddlTipoDocumento.DataBind();
            //    this.TipoDocumento = "COTIZACION";
            //}
            this.ddlTipoDocumento.Items.Insert(0, new ListItem("-Seleccione-", string.Empty));

            //-------------------------------------------
            
            //lstCombos.Add("BancoCheque", lstBancoCheque);
            //lstCombos.Add("BancoDepo", ltsBancoDepo);
            //lstCombos.Add("Procesadora", lstProcesadora)
            Dictionary<string, List<GenericBE>> dict = (Dictionary<string, List<GenericBE>>)Session["CargarCombos"];
            this.ddlOperador.DataValueField = "Codigo";
            this.ddlOperador.DataTextField = "Descripcion";
            this.ddlOperador.DataSource = dict["Procesadora"].ToList();
            this.ddlOperador.DataBind();
        }

        protected void ddlMedioPago_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.CargarCondiciones();
        }

        protected void CargarCondiciones()
        {
            this.trOtros.Visible = this.trTarjeta.Visible = false;

            if (this.ddlMedioPago.SelectedIndex > 0)
            {
                if (this.ddlMedioPago.SelectedValue == "04") this.trTarjeta.Visible = true;
                else if (this.ddlMedioPago.SelectedValue != "02")
                {

                    this.ddlBanco.DataSource =null;
                    this.ddlBanco.DataBind();

                    Dictionary<string, List<GenericBE>> dict = (Dictionary<string, List<GenericBE>>)Session["CargarCombos"];
                    this.ddlBanco.DataValueField = "Codigo";
                    this.ddlBanco.DataTextField = "Descripcion";
                    

                    this.trOtros.Visible = true;
                    if (this.ddlMedioPago.SelectedValue == "03")
                    {
                        this.ddlBanco.DataSource = dict["BancoCheque"].ToList();
                    }
                    else
                    {
                        this.ddlBanco.DataSource = dict["BancoDepo"].ToList();                    
                    }
                    this.ddlBanco.DataBind();
                }
            }
        }
        
        protected void btnAddItemMedioPago_Click(object sender, EventArgs e)
        {

            string strMoneda = (this.hfMoneda.Value == "USD") ? "$." : "S/.";
            string strMonedaAlt = (this.hfMoneda.Value == "USD") ? "S/." : "$.";

            decimal montoPagado = (Session["total"] != null) ? Convert.ToDecimal(Session["total"]) : 0;
            decimal montoTotal = (!string.IsNullOrEmpty(this.hfTotal.Value)) ? Convert.ToDecimal(this.hfTotal.Value) : 0;
            decimal pendiente = montoTotal - montoPagado;

            if (ddlTipoDocumento.SelectedValue == "")
            {
                this.lblMensaje.Text = "Verificar: <strong>" + "Tipo de documento de facturación." + "</strong><br />";
                this.mpeMensaje.Show();
            }
            else if (txtNroFolioFijo.Text.Equals("") || txtNroFolio.Text.Equals(""))
            {
                this.lblMensaje.Text = "Verificar: <br />" +
                                                   "<strong>" + "Nro. de folio fijo" + "</strong> <br />" +
                                                   "<strong>" + "Nro. de folio digitado" + "</strong>";
                this.mpeMensaje.Show();
            }
            else if (Math.Round(pendiente, 2) > 0)
            {
                decimal pendienteAlt = 0;
                if (TipoCambio != 0)
                {
                    pendienteAlt = (this.hfMoneda.Value == "USD") ? pendiente * this.TipoCambio : pendiente / this.TipoCambio;

                    this.lblPendiente.Text = "Pendiente Pago: <strong>" + strMoneda + pendiente.ToString("N", CultureInfo.InvariantCulture) + "</strong><br />" +
                                                          "<strong>" + strMonedaAlt + pendienteAlt.ToString("N", CultureInfo.InvariantCulture) + "</strong>";
                }
                else
                {
                    this.lblPendiente.Text = "Pendiente Pago: <strong>" + strMoneda + pendiente.ToString("N", CultureInfo.InvariantCulture) + "</strong>";
                }

                this.pnlAddPago.Visible = true;

                this.ddlMedioPago.SelectedIndex = -1;
                this.txtMontoMedioPago.Text = string.Empty;
                this.ddlMonedaMedioPago.SelectedIndex = -1;
                this.ddlOperador.SelectedIndex = -1;
                this.txtAP.Text = string.Empty;
                this.txtREF.Text = string.Empty;
                this.txtNroOperacionMP.Text = string.Empty;
                this.ddlBanco.SelectedIndex = -1;

                if (this.TipoCambio == 0)
                {
                    this.ddlMonedaMedioPago.SelectedValue = this.hfMoneda.Value;
                    this.ddlMonedaMedioPago.Enabled = false;
                }

                this.CargarCondiciones();
            }
            else
            {
                this.lblPendiente.Text = "Pendiente Pago: <strong>" + strMoneda + 0.ToString("N", CultureInfo.InvariantCulture) + "</strong><br />" +
                                                          "<strong>" + strMonedaAlt + 0.ToString("N", CultureInfo.InvariantCulture) + "</strong>";

                this.lblMensaje.Text = "Ya se ha superado el monto total";
                this.mpeMensaje.Show();
            }
            

        }
               
        protected void btnDelItemMedioPago_Click(object sender, EventArgs e)
        {
            lstDPago = (List<DetPagosBE>)Session["listDPago"];
            foreach (GridViewRow dli in gvMedioPago.Rows)
            {
                CheckBox chkBorrar = (CheckBox)dli.FindControl("cbSelect");
                Label lblid = (Label)dli.FindControl("lblID");

                if (chkBorrar != null && chkBorrar.Checked)
                {
                    DetPagosBE obj = lstDPago.Find(X => X.Indice == dli.RowIndex);
                    if (obj != null)
                    {                    
                        decimal monto = 0;
                        if (obj.Moneda != this.hfMoneda.Value)
                        {
                            if (obj.Moneda == "USD")
                            {
                                monto = obj.Monto * TipoCambio;
                            }
                            else
                            {
                                monto = obj.Monto * TipoCambio;
                            }
                        }
                        else 
                        {
                            monto = obj.Monto;
                        }
                        lstDPago.Remove(obj);
                        Session["total"] = (Session["total"] != null) ? Convert.ToDecimal(Session["total"]) - monto : 0;

                        List<string> lista = this.ListaEfectivo;
                        lista.Remove(obj.Tipo +  "_" + obj.Moneda);
                        this.ListaEfectivo = lista;
                    }
                }
            }

            Session["listDPago"] = lstDPago;
            gvMedioPago.DataSource = lstDPago;
            gvMedioPago.DataBind();
            this.CalcularTotal();
        }   

        protected void btnProcesarMedioPago_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                string mensaje = this.ValidarGrabar();

                if (mensaje == "OK")
                {

                    UsuarioWebBE uw = new UsuarioWebBE();
                    uw = (UsuarioWebBE)Session["UsuarioWeb"];
                    //validamos si el numero de documento existe
                    PedidoBE objP = (PedidoBE)Session["Pedido"];
                    
                    objPago.auart = objP.ClaseDocumento;
                    objPago.nro_cotizacion = txtNumPedido.Text.Trim();
                    objPago.Caja = uw.vstel; //es puesto de expedicion
                    objPago.Fecha = Convert.ToDateTime(DateTime.Now.ToShortDateString());
                    objPago.Turno = uw.turno;
                    objPago.Cajero = uw.Usuario;
                    objPago.Monto_T = Convert.ToDecimal(txtMontoMedioPago.Text);
                    objPago.Vuelto = (!string.IsNullOrEmpty(this.hfVuelto.Value)) ? decimal.Parse(this.hfVuelto.Value) : 0;
                    objPago.Waers_Vuelto = (!string.IsNullOrEmpty(this.hfVuelto.Value)) ? this.ddlMonedaVuelto.SelectedValue : string.Empty;
                    objPago.Boveda = "";

                    DetPedFacBE factura = new DetPedFacBE();
                    lstPFac.Add(factura);
                    factura.Caja = uw.vstel;
                    factura.Cajero = uw.Usuario;
                    factura.Fecha = Convert.ToDateTime(DateTime.Now.ToShortDateString());
                    factura.Folio = this.txtNroFolio.Text;
                    factura.Monto = objPago.Monto_T;
                    factura.NroPedido = objP.NumPedido;
                    int ind = ddlTipoDocumento.SelectedValue.ToString().IndexOf('-');
                    factura.Tipo = this.ddlTipoDocumento.SelectedValue.Substring(0, ind);
                    factura.Turno = uw.turno;                    

                    List<DetPagosBE> listPago = (List<DetPagosBE>)Session["listDPago"];

                    foreach (DetPagosBE item in listPago)
                    {
                        item.Caja = uw.vstel;
                        item.Cajero = uw.Usuario;
                        item.Fecha = Convert.ToDateTime(DateTime.Now.ToShortDateString());
                        item.Nro_Pedido = objP.NumPedido;
                        //item.Tipo = this.ddlMedioPago.SelectedValue;
                        //item.Operador = this.ddlOperador.SelectedValue;
                        item.Turno = uw.turno;                        
                    }
                    string tipMsg = "";
                    string result = PedidoBC.Instance.InsertPago(objPago, listPago, lstPFac, out tipMsg);
                    if (tipMsg == "E")
                    {
                        mensaje = result;
                        this.lblMensaje.Text = mensaje;
                        this.mpeMensaje.Show();
                    }
                    else
                    {
                        this.Mensaje = "Documento a imprimir: " + this.txtNumPedido.Text + " ";
                        Session["Folio"] = txtNroFolioFijo.Text + "-" + txtNroFolio.Text.PadLeft(7, '0');
                        if (!string.IsNullOrEmpty(result)) this.Mensaje = this.Mensaje + "Mensaje: " + result;
                        this.Aceptar(sender, e);
                    }
                   
                }
                else 
                {
                    this.lblMensaje.Text = mensaje;
                    this.mpeMensaje.Show();
                }
            }
            catch(Exception ex)
            {
                this.lblMensaje.Text = "Ha ocurrido un error." +  ex.Message;
                this.mpeMensaje.Show();
            }
        }

        protected void gvMedioPago_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            Label lbl = (Label)e.Row.FindControl("lblID");
            lstDPago = (List<DetPagosBE>)Session["listDPago"];
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                for (int i = 0; i < lstDPago.Count; i++)
                {
                    if (e.Row.RowIndex == i)
                    {
                        lstDPago[i].Indice = Convert.ToInt32(lbl.Text) - 1;                        
                    }
                }
            }
            Session["listDPago"] = lstDPago;
        }

        protected void btnAddOk_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.lVuelto.Text) && this.lVuelto.Visible == false)
            {

                string mensaje = this.ValidarAdd();

                if (mensaje == "OK")
                {

                    DetPagosBE objDPago = new DetPagosBE();
                    DetPedFacBE objPFac = new DetPedFacBE();
                    lstDPago = Session["listDPago"] != null ? (List<DetPagosBE>)Session["listDPago"] : lstDPago;
                    objDPago.Monto = txtMontoMedioPago.Text == "" ? 0 : Convert.ToDecimal(txtMontoMedioPago.Text);
                    objDPago.Moneda = ddlMonedaMedioPago.SelectedValue.ToString();
                    if (ddlMedioPago.SelectedValue == "03")
                    {
                        objDPago.Operacion = "NRO:" + txtNroOperacionMP.Text.Trim() + ",Banco:" + ddlBanco.Text;
                    }
                    else if (ddlMedioPago.SelectedValue == "05")
                    {
                        objDPago.Operacion = "NOOP:" + txtNroOperacionMP.Text.Trim() + ",BANCO:" + ddlBanco.Text;
                    }
                    else if (ddlMedioPago.SelectedValue == "04")
                    {
                        objDPago.Operacion = "AP:" + this.txtAP.Text.Trim() + ",BANCO:" + txtREF.Text.Trim();
                        objDPago.Operador = ddlOperador.SelectedValue;
                    }
                    else
                    {
                        objDPago.Operacion = "";
                    }
                    objDPago.Tipo = ddlMedioPago.SelectedValue;
                    objDPago.DesTipo = ddlMedioPago.SelectedItem.Text;

                    bool flagEfectivo = true;

                    if (this.ddlMedioPago.SelectedValue == "02")
                    {
                        List<string> list = this.ListaEfectivo;
                                                
                        if (list.IndexOf(this.ddlMedioPago.SelectedValue + "_" + objDPago.Moneda) == -1)
                        {
                            list.Add(this.ddlMedioPago.SelectedValue + "_" + objDPago.Moneda);
                        }
                        else 
                        {
                            flagEfectivo = false;
                        }

                        this.ListaEfectivo = list;
                    }

                    if (flagEfectivo)
                    {

                        decimal suma = objDPago.Monto;
                        string moneda = objDPago.Moneda;

                        if (moneda != this.hfMoneda.Value)
                        {
                            if (moneda == "USD") suma = suma * this.TipoCambio;
                            else suma = suma / this.TipoCambio;
                        }

                        Session["total"] = (Session["total"] != null) ? Convert.ToDecimal(Session["total"]) + suma : suma;

                        decimal montoTotal = (!string.IsNullOrEmpty(this.hfTotal.Value)) ? Convert.ToDecimal(this.hfTotal.Value) : 0;
                        decimal total = Convert.ToDecimal(Session["total"]);

                        bool flag = true;
                        if (objDPago.Tipo == "02")
                        {
                            this.hfMontoEfectivo.Value = (!string.IsNullOrEmpty(this.hfMontoEfectivo.Value)) ?
                                (decimal.Parse(this.hfMontoEfectivo.Value) + suma).ToString() : suma.ToString();
                        }

                        if (objDPago.Tipo != "02")
                        {
                            decimal efectivo = (!string.IsNullOrEmpty(this.hfMontoEfectivo.Value)) ? decimal.Parse(this.hfMontoEfectivo.Value) : 0;

                            if (montoTotal - efectivo < total - efectivo)
                            {
                                flag = false;
                            }
                        }

                        if (flag)
                        {
                            lstDPago.Add(objDPago);

                            Session["listDPago"] = lstDPago;

                            gvMedioPago.DataSource = lstDPago;
                            gvMedioPago.DataBind();

                            this.pnlAddPago.Visible = false;
                            this.CalcularTotal();
                        }
                        else
                        {
                            Session["total"] = total - suma;
                            this.lblMensaje.Text = "El monto ha superado el monto a pagar";
                            this.mpeMensaje.Show();
                        }
                    }
                    else
                    {                      
                        this.lblMensaje.Text = "No se puede agregar forma de pago efectivo con la misma moneda más de una vez.";
                        this.mpeMensaje.Show();
                    }
                }
                else
                {
                    this.lblMensaje.Text = mensaje;
                    this.mpeMensaje.Show();
                }
            }
            else 
            {
                this.lblMensaje.Text = "Ya no se pueden agregar más formas de pago, existe vuelto.";
                this.mpeMensaje.Show();
            }
        }

        protected void CalcularTotal()
        {
            string strMoneda = (this.hfMoneda.Value == "USD") ? "$." : "S/.";
            decimal monto = (Session["total"] != null) ? Convert.ToDecimal(Session["total"]) : 0;
            this.lTotalPago.Text = strMoneda + monto.ToString("N", CultureInfo.InvariantCulture);


            if (Session["listDPago"]!=null)
            {
                List<DetPagosBE> list = (List<DetPagosBE>)Session["listDPago"];

                bool flag = false;
                foreach (DetPagosBE item in list)
                {
                    if (item.Tipo == "02")
                    {
                        flag = true;
                        break;
                    }
                }

                if (flag)
                {
                    this.hfValidacion.Value = "S";

                    decimal montoPagado = (Session["total"] != null) ? Convert.ToDecimal(Session["total"]) : 0;
                    decimal montoTotal = (!string.IsNullOrEmpty(this.hfTotal.Value)) ? Convert.ToDecimal(this.hfTotal.Value) : 0;

                    if (montoPagado > montoTotal)
                    {
                        this.lTitVuelto.Visible = true;
                        this.ddlMonedaVuelto.Visible = true;
                        this.lMonVuelto.Visible = true;
                        this.lVuelto.Visible = true;
                        this.ddlMonedaVuelto.SelectedValue = this.hfMoneda.Value;
                        this.hfMonedaVuelto.Value = this.hfMoneda.Value;
                        this.hfVuelto.Value = (montoPagado - montoTotal).ToString();
                        this.lVuelto.Text = strMoneda + (montoPagado - montoTotal).ToString("N", CultureInfo.InvariantCulture);

                    }
                    else
                    {
                        this.lTitVuelto.Visible = false;
                        this.lVuelto.Text = string.Empty;
                        this.lVuelto.Visible = false;
                        this.ddlMonedaVuelto.Visible = false;
                        this.lMonVuelto.Visible = false;
                    }                    
                }
                else 
                {
                    this.hfValidacion.Value = "N";
                    this.lTitVuelto.Visible = false;
                    this.lVuelto.Visible = false;
                    this.lVuelto.Text = string.Empty;
                    this.ddlMonedaVuelto.Visible = false;
                    this.lMonVuelto.Visible = false;
                }
            }
        }

        protected void btnAddClose_Click(object sender, EventArgs e)
        {
            this.pnlAddPago.Visible = false;
        }

        protected void ddlMonedaVuelto_SelectedIndexChanged(object sender, EventArgs e)
        {
            decimal monto = (!string.IsNullOrEmpty(this.hfVuelto.Value)) ?
                Convert.ToDecimal(this.hfVuelto.Value) : 0;

            string strMoneda = (this.ddlMonedaVuelto.SelectedValue == "USD") ? "$." : "S/.";

            if (this.hfMonedaVuelto.Value == "USD" && this.ddlMonedaVuelto.SelectedValue == "PEN")
            {
                monto = monto * this.TipoCambio;
            }
            if (this.hfMonedaVuelto.Value == "PEN" && this.ddlMonedaVuelto.SelectedValue == "USD")
            {
                monto = monto / this.TipoCambio;
            }

            this.hfVuelto.Value = (monto).ToString();
            this.hfMonedaVuelto.Value = this.ddlMonedaVuelto.SelectedValue;
            this.lVuelto.Text = strMoneda + (monto).ToString("N", CultureInfo.InvariantCulture);
        }
                
        protected void ddlTipoDocumento_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.ddlTipoDocumento.SelectedIndex > 0)
            {
                //item 1 factura
                //item 2 boleta
                UsuarioWebBE uw = new UsuarioWebBE();

                List<GenericBE> lstOficinas = new List<GenericBE>();
                List<GenericBE> lstCodigoPostal = new List<GenericBE>();
                List<GenericBE> lstTipoDocumento = new List<GenericBE>();
                List<GenericBE> lstGrupoVendedores = new List<GenericBE>();
                List<GenericBE> lstSectores = new List<GenericBE>();
                List<GenericBE> lstMotivos = new List<GenericBE>();
                List<GenericBE> lstGrupoCond = new List<GenericBE>();
                List<GenericBE> lstBloqueoEntrega = new List<GenericBE>();
                List<GenericBE> lstBloqueoFactura = new List<GenericBE>();
                List<GenericBE> lstVendedores = new List<GenericBE>();
                List<GenericBE> lstTipoVisita = new List<GenericBE>();
                List<GenericBE> lstCondicionPago = new List<GenericBE>();
                List<GenericBE> lstAlmacen = new List<GenericBE>();
                List<GenericBE> lstAsesores = new List<GenericBE>();
                List<GenericBE> lstCondExp = new List<GenericBE>();
                List<GenericBE> lstCanal = new List<GenericBE>();
                List<GenericBE> lstOrgVta = new List<GenericBE>();
                List<GenericBE> lstMotRec = new List<GenericBE>();
                List<GenericBE> lstZonaReg = new List<GenericBE>();
                List<GenericBE> lstGrupoCli = new List<GenericBE>();
                List<GenericBE> lstCampaña = new List<GenericBE>();
                List<GenericBE> lstCity = new List<GenericBE>();
                List<GenericBE> lstColor = new List<GenericBE>();
                List<GenericBE> lstGrpArt = new List<GenericBE>();
                List<GenericBE> lstZReg = new List<GenericBE>();
                List<GenericBE> lstDispo = new List<GenericBE>();
                List<UbigeoBE> lstUbigeos = new List<UbigeoBE>();
                List<GenericBE> lstBancoCheque = new List<GenericBE>();
                List<GenericBE> ltsBancoDepo = new List<GenericBE>();
                List<GenericBE> lstProcesadora = new List<GenericBE>();
                List<LibrosxvstelBE> lstLibrosxvstel = new List<LibrosxvstelBE>();
                DateTime fecHasta = new DateTime();
                decimal pIGV;

                ParametroBC.Instance.getDataDDL(ref lstAlmacen, ref lstAsesores,
                 ref lstBloqueoEntrega, ref lstBloqueoFactura, ref lstCanal, ref lstCondExp, ref lstCondicionPago,
                 ref lstGrupoCond, ref lstGrupoVendedores, ref lstMotivos, ref lstOficinas, ref lstOrgVta, ref lstSectores,
                 ref lstTipoDocumento, out fecHasta, ref lstMotRec, ref lstZonaReg, ref lstGrupoCli, ref lstUbigeos, ref lstCampaña,
                 ref lstCity, ref lstColor, ref lstDispo, ref lstGrpArt, ref lstZReg,
                 ref lstBancoCheque, ref ltsBancoDepo, ref lstProcesadora, ref lstLibrosxvstel, out pIGV);

                //List<LibrosxvstelBE> lstLibrosxvstel  = (List<LibrosxvstelBE>)Session["librosxvstel"];
                uw = (UsuarioWebBE)Session["UsuarioWeb"];
                int ind = ddlTipoDocumento.SelectedValue.ToString().IndexOf('-');
                foreach (LibrosxvstelBE item in lstLibrosxvstel)
                {
                    if (item.Vstel.Equals(uw.vstel) && this.ddlTipoDocumento.SelectedValue.ToString().Substring(0, ind).Equals(item.Invtp))
                    {
                        this.txtNroFolioFijo.Text = item.Invtp + "-" + item.Rgtno;//this.ddlTipoDocumento.SelectedValue + "-" + uw.Libro;
                        if (item.DocSecuencia != "")
                        {
                            txtNroFolio.Text = (Convert.ToInt64(item.DocSecuencia) + 1).ToString().PadLeft(7,'0');
                        }
                    
                    }
                }
            }
            else 
            {
                this.txtNroFolio.Text = this.txtNroFolioFijo.Text = string.Empty;
            }
        }

        protected string ValidarAdd()
        {
            StringBuilder str = new StringBuilder();
            string validacion = string.Empty;
            bool flag = true;


            if (this.ddlMedioPago.SelectedIndex == 0)
            {
                str.Append("<li>Seleccione el medio de pago.</li>");
                flag = false;
            }
            if (string.IsNullOrEmpty(this.txtMontoMedioPago.Text))
            {
                str.Append("<li>Ingrese el monto a pagar.</li>");
                flag = false;
            }
            else 
            {
                decimal monto = 0;
                if (!decimal.TryParse(this.txtMontoMedioPago.Text, out monto))
                {
                    str.Append("<li>Ingrese un monto válido.</li>");
                    flag = false;
                }
                else 
                {
                    if (monto <= 0)
                    {
                        str.Append("<li>Ingrese un monto superior a cero.</li>");
                        flag = false;
                    }
                }
            }
            if (this.ddlMonedaMedioPago.SelectedIndex == 0)
            {
                str.Append("<li>Seleccione la moneda de pago.</li>");
                flag = false;
            }

            string formaPago = this.ddlMedioPago.SelectedValue;

            if (formaPago == "03" || formaPago == "05")
            {
                if (string.IsNullOrEmpty(this.txtNroOperacionMP.Text))
                {
                    str.Append("<li>Ingrese el número de operación.</li>");
                    flag = false;
                }
                if (this.ddlBanco.SelectedIndex == 0)
                {
                    str.Append("<li>Seleccione el banco.</li>");
                    flag = false;
                }
            }

            if (formaPago == "04")
            {
                if (this.ddlOperador.SelectedIndex == 0)
                {
                    str.Append("<li>Seleccione un operador.</li>");
                    flag = false;
                }
                if (string.IsNullOrEmpty(this.txtAP.Text))
                {
                    str.Append("<li>Ingrese el AP.</li>");
                    flag = false;
                }
                if (string.IsNullOrEmpty(this.txtREF.Text))
                {
                    str.Append("<li>Ingresa la REF.</li>");
                    flag = false;
                }                
            }

            if (flag) validacion = "OK";
            else 
            {
                validacion = String.Format("<ul>{0}</ul>", str.ToString());
            }

            return validacion;
        }

        protected string ValidarGrabar()
        {
            StringBuilder str = new StringBuilder();
            string validacion = string.Empty;
            bool flag = true;

            if (this.ddlTipoDocumento.SelectedIndex == 0)
            {
                str.Append("<li>Seleccione el iipo de documento.</li>");
                flag = false;
            }
            if (string.IsNullOrEmpty(this.txtNroFolio.Text))
            {
                str.Append("<li>Ingrese el número de folio.</li>");
                flag = false;
            }
            if (Session["listDPago"] == null)
            {
                str.Append("<li>Agrege al menos una forma de pago.</li>");
                flag = false;
            }
            else 
            {
                if (((List<DetPagosBE>)Session["listDPago"]).Count == 0)
                {
                    str.Append("<li>Agrege al menos una forma de pago.</li>");
                    flag = false;
                }
                else 
                {
                      decimal montoPagado = (Session["total"] != null) ? Convert.ToDecimal(Session["total"]) : 0;
                      decimal montoTotal = (!string.IsNullOrEmpty(this.hfTotal.Value)) ? Convert.ToDecimal(this.hfTotal.Value) : 0;

                      if (this.hfValidacion.Value == "N")
                      {
                          if (decimal.Ceiling(montoPagado) != decimal.Ceiling(montoTotal))
                          {
                              str.Append("<li>El monto a pagar debe ser igual al total del pedido.</li>");
                              flag = false;
                          }
                      }
                      else 
                      {
                          if (decimal.Ceiling(montoPagado) < decimal.Ceiling(montoTotal))
                          {
                              str.Append("<li>El monto a pagar debe ser  mayor o igual al monto del pedido.</li>");
                              flag = false;
                          }
                      }
                }
            }

            if (flag) validacion = "OK";
            else
            {
                validacion = String.Format("<ul>{0}</ul>", str.ToString());
            }

            return validacion;
        }
    }
}